﻿using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.IO;

namespace DocTes.Jerarquias
{
    /// <summary>
    /// Control de administracion de proyectos (Creación, borrado y edición)
    /// </summary>
    public partial class ControlProyectos : System.Web.UI.UserControl
    {
        /// <summary>
        /// Page load del control
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
					ControlEstadosProyecto1.SetVisibilidadEstados(false);
                    ControlEstadosDocumentosProyecto1.SetVisibilidadEstados(false);

                
                    
            }
        }
        /// <summary>
        /// Antes de insertar un nuevo proyecto a la base de datos 
        /// Se crea un nuevo ID cuando se esta insertando
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void LinqDataSourceDetallesProyecto_Inserting(object sender, LinqDataSourceInsertEventArgs e)
        {
            ((Proyecto)(e.NewObject)).Id = Guid.NewGuid();
            ((Proyecto)(e.NewObject)).FechaCreacion = DateTime.Now;
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void GridViewProyectos_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            if (e.CommandName == "Select")
            {
                ControlEstadosProyecto1.SetVisibilidadEstados(true);
                ControlEstadosDocumentosProyecto1.SetVisibilidadEstados(true);
                int seleccion = int.Parse(e.CommandArgument.ToString());
                HiddenFieldIdProyecto.Value = GridViewProyectos.DataKeys[seleccion].Value.ToString();
                ControlEstadosDocumentosProyecto1.IdProyecto = HiddenFieldIdProyecto.Value;
                ControlEstadosProyecto1.IdProyecto = HiddenFieldIdProyecto.Value;
            }
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void LinqDataSourceDetallesProyecto_Inserted(object sender, LinqDataSourceStatusEventArgs e)
        {
           //se crea la carpeta base del proyecto una vez creado
			  string nombreCarpetaBase = "CarpetaBase_" + ((Proyecto)(e.Result)).IdCliente.ToString() + "_" + ((Proyecto)(e.Result)).Id.ToString();

			  Administrador admin = new Administrador(new FabricaLinqDataSource(), new EntidadLinqDataContext());
			  admin.InsertarCarpeta(nombreCarpetaBase);
			  

			  //y se agregan las asociaciones con los estados necesarias
			  admin.InicializarAsociacionesEstadosPredeterminados(((Proyecto)(e.Result)).Id);

			  admin.Dispose();

			  GridViewProyectos.DataBind();
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void LinqDataSourceDetallesProyecto_Updated(object sender, LinqDataSourceStatusEventArgs e)
        {
			  DetailsViewCliente.DataBind();
            GridViewProyectos.DataBind();
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void LinqDataSourceDetallesProyecto_Updating(object sender, LinqDataSourceUpdateEventArgs e)
        {
            string nombreCarpetaBase = "CarpetaBase_" + ((Proyecto)(e.NewObject)).IdCliente.ToString() + "_" + ((Proyecto)(e.NewObject)).Id.ToString();
            DropDownList estado = DetailsViewCliente.FindControl("DropDownListEstados") as DropDownList;
            string estadoSeleccionado = estado.SelectedValue;
            ((Proyecto)(e.NewObject)).IdEstadoSeleccionado = estadoSeleccionado;
            FileUpload archivosModificar = DetailsViewCliente.FindControl("FileUploadResumenEditar") as FileUpload;
            ModificarArchivo(nombreCarpetaBase, archivosModificar, new Guid(HiddenFieldIdProyecto.Value));

        }

        private void ModificarArchivo(string nombreCarpetaBase, FileUpload archivosModificar, Guid idProyecto)
        {
            if (archivosModificar.HasFile)
            {
                Administrador admin = new Administrador(new FabricaLinqDataSource(), new EntidadLinqDataContext());
                admin.InsertarDocumentoReporte(idProyecto, archivosModificar.FileName, new System.Data.Linq.Binary(archivosModificar.FileBytes), nombreCarpetaBase);
                admin.Dispose();
            }
        }
		 
		  
		  /// <summary>
		  /// Evento para redireccionar al editor de estructura de documentos por proyecto.
		  /// </summary>
		  /// <param name="sender"></param>
		  /// <param name="e"></param>
		  protected void DetailsViewCliente_ItemCommand(object sender, DetailsViewCommandEventArgs e)
		  {
			  if (e.CommandName == "EditarEstructura")
			  {
				  Response.Redirect("EstructuraDocumentos.aspx?idCliente=" + GridViewProyectos.SelectedDataKey.Values["IdCliente"].ToString() + "&idProyecto=" + GridViewProyectos.SelectedDataKey.Value.ToString());
			  }
              if (e.CommandName == "ReporteDocumentos")
              {
                  Administrador admin = new Administrador(new FabricaLinqDataSource(), new EntidadLinqDataContext());
                  MemoryStream reporte = new MemoryStream();
                  admin.CrearReporteDocumentosByProyecto(reporte, new Guid(HiddenFieldIdProyecto.Value), false);
                  Response.Clear();
                  Response.AppendHeader("Content-Disposition", "attachment; filename=" + "Reporte.csv");
                  
                  Response.BinaryWrite(reporte.GetBuffer());
                  Response.End();
                  reporte.Dispose();
                  admin.Dispose();
              }
              if (e.CommandName == "ReporteCostos")
              {
                  Administrador admin = new Administrador(new FabricaLinqDataSource(), new EntidadLinqDataContext());
                  MemoryStream reporte = new MemoryStream();
                  admin.CrearReporteDocumentosByProyecto(reporte, new Guid(HiddenFieldIdProyecto.Value), true);
                  Response.Clear();
                  Response.AppendHeader("Content-Disposition", "attachment; filename=" + "Reporte.csv");

                  Response.BinaryWrite(reporte.GetBuffer());
                  Response.End();
                  reporte.Dispose();
                  admin.Dispose();
              }

		  }

	
		  
        


        /// <summary>
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void DropDownListEstados_DataBound(object sender, EventArgs e)
        {
            ListItem itemVacio = new ListItem("- - -", "- - -");
            ((DropDownList)sender).Items.Insert(0, itemVacio);
            Administrador admin = new Administrador(new FabricaLinqDataSource(), new EntidadLinqDataContext());
            ((DropDownList)sender).SelectedValue = admin.GetEstadoSeleccionadoProyecto(new Guid(HiddenFieldIdProyecto.Value));

        }

        /// <summary>
        /// Se borra todo lo relacionado al proyecto 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void LinqDataSourceDetallesProyecto_Deleting(object sender, LinqDataSourceDeleteEventArgs e)
        {
            Guid idClienteBorrar = ((Proyecto)(e.OriginalObject)).Id;
            Administrador admin = new Administrador(new FabricaLinqDataSource(), new EntidadLinqDataContext());
            //admin.BorrarDocumentosByIdProyecto()

        }

        /// <summary>
        /// Evento area seleccionada para filtro
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void DropDownList2_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (DropDownList2.SelectedValue == "0")
                LinqDataSourceProyectos.Where = "";
            else
            LinqDataSourceProyectos.Where = "Area.Nombre = " + DropDownList2.SelectedItem.Text;
        }

        /// <summary>
        /// Evento cliente seleccionado para filtro
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void DropDownListCliente_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (DropDownListCliente.SelectedValue == "0")
                LinqDataSourceProyectos.Where = "";
            else
                LinqDataSourceProyectos.Where = "Cliente.Nombre = " + DropDownList2.SelectedItem.Text;
        }

        
        









    }
}
